/**
 * 把（nums），（nums + 缺失的两个数（a, b））这两区间加在一起，就可以转化成：260. 只出现一次的数字 III
 */
class Solution10 {
    public int[] missingTwo(int[] nums) {
        int n = nums.length;
        int tmp = 0;
        for(int i = 1; i <= n + 2; i++) {
            tmp ^= i;
        }
        for(int x : nums) {
            tmp ^= x;
        }

        // 找到最右边为1的比特位（lowbit）
        int lowbit = tmp & (-tmp);

        // 这时，就可以把【（nums）+（nums + 缺失的两个数（a, b））】划分为两个区间
        //      一个是lowbit位为0的区间，一个是lowbit位为1的区间
        int x = 0, y = 0;
        for(int i = 1; i <= n + 2; i++) {
            if((i & lowbit) == 0) {
                x ^= i;
            } else {
                // (i & lowbit) == 1
                y ^= i;
            }
        }
        for(int i = 0; i < n; i++) {
            if((nums[i] & lowbit) == 0) {
                x ^= nums[i];
            } else {
                // (nums[i] & lowbit) == 1
                y ^= nums[i];
            }
        }

        return new int[]{x, y};
    }
}